09 - Kamera termowizyjna
Wprowadzenie do Systemów Wizyjnych
Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej
Ćwiczenie laboratoryjne 9: kamera termowizyjna
Powrót do spisu treści ćwiczeń laboratoryjnych
Wstęp
Kamery termowizyjne pozwalają na rejestrację promieniowania cieplnego, które jest emitowane przez ciała fizyczne w paśmie podczerwieni bez dodatkowego oświetlania zewnętrznym źródłem światła. Termowizja stosowana jest przykładowo w zastosowaniach związanych ze zdalnym określaniem temperatury, diagnostyką urządzeń mechanicznych lub obwodów elektrycznych, rozwiązaniach z zakresu bezpieczeństwa.
Promieniowanie podczerwone (IR) jest to promieniowanie elektromagnetyczne o zakresie fali od około 0.8 μm do 1000 μm. W porównaniu do światła widzialnego promieniowanie podczerwone charakteryzuje się falami o dłuższej długości. Ich zakres w porównaniu do zakresu światła widzialnego, ultrafioletowego oraz innych typów fal elektromagnetycznych został przedstawiony na poniższym rysunku:
Podczas zajęć wykorzystana zostanie kamera termowizyjna FLIR Lepton 3.5 wraz z modułem PureThermal 2 Smart I/O Module pozwalającym na użycie sensora wizyjnego jako standardowej kamery przy użyciu USB. Pozwala ona na rejestrację pasma podczerwieni o długości fal 8-14 μm, z dokładnością do 0.05°C w zakresie od -10 do 400°C. Wygląd obwodu drukowanego wraz sensorem został przedstawiony na poniższym rysunku.
Wykorzystywany sensor zwraca informacje w postaci 16-bitowej wartości liczbowej (0 - 65535) dla każdego piksela. Wartości temperatury wyznaczane sa przy wykorzystaniu poniższego wzoru:
UWAGA Ta instrukcja wymaga systemu operacyjnego Ubuntu oraz zainstalowanych dodatkowych driverów.
Zadanie wstępne
Podepnij kamerę termowizyjną do portu USB i wykorzystując poniższy kod zapoznaj się z obrazem zwracanym z kamery termowizyjnej konwertowanym do 8-bitowego formatu RGB. Sprawdź wymiary oraz zakres wartości zwracanego obrazu.
import cv2
def camera():
"""Thermal camera 8-bit RGB capture."""
= cv2.VideoCapture(2)
cap
while True:
= cap.read()
ret, frame if not ret:
print("Cannot connect to the camera.")
break
"Thermal RGB image", frame)
cv2.imshow(
if cv2.waitKey(10) == ord('q'):
break
if __name__ == '__main__':
camera()
Zadania do samodzielnej realizacji
- Korzystając z podanego poniżej kodu przygotuj aplikację wyświetlającą maksymalną, minimalną oraz średnią temperaturę zmierzoną na zarejestrowanym obrazie. W tym celu:
- stwórz nowy skrypt np. o nazwie
show_temperature.py
i dodaj poniższy kod - uzupełnij funkcję
calculate_temperature()
zgodnie z wyżej przedstawionym wzorem - korzystając z przygotowanego konwertera wyznacz maksymalną, minimalną oraz średnią temperaturę
- dodaj wyświetlanie powyższych wartości na obrazie korzystając z metody putText() dostępnej w bibliotece OpenCV
import cv2
import numpy as np
def calculate_temperature(thermal_frame: np.ndarray) -> np.ndarray:
"""Temperature calculation from camera raw output values.
Parameters
----------
thermal_frame : np.ndarray
Camera raw thermal frame.
Returns
-------
np.ndarray
Output thermal frame converted to temperature in Celsius degrees.
"""
### TODO: Complete temperature conversion ###
= ...
temperature
return np.round(temperature, 1)
#####################
def show_temperature():
"""Show thermal image and display min, max, mean measured temperature."""
= cv2.VideoCapture(2)
cap set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter.fourcc('Y','1','6',' '))
cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)
cap.
while True:
= cap.read()
ret, frame = frame[:120]
frame
if ret == False:
break
### TODO: Calculate max, min and mean temperature in frame ###
= 0
temp_max = 0
temp_min = 0
temp_mean #####################
= (frame - np.min(frame)) / (np.max(frame) - np.min(frame))
norm = cv2.cvtColor(np.uint8(norm * 255.), cv2.COLOR_GRAY2BGR)
color_frame
### TODO: Add temperature information to frame using cv2.putText method ###
#####################
"Measured temperature", color_frame)
cv2.imshow(
= cv2.waitKey(10)
k
if k == ord('q'):
break
if __name__ == '__main__':
show_temperature()
Przykładowy rezultat został przedstawiony poniżej:
- Przygotuj skrypt usuwający wartości o niższej temperaturze niż ustalony próg. Dostosuj dynamicznie próg przy pomocy suwaka, a następnie zastąp tło (wartości poniżej progu) własnym zdjęciem. W tym celu:
- stwórz nowy skrypt np. o nazwie
change_background.py
i na początek skorzystaj z wyżej przedstawionego przykładowego kodu - uzupełnij funkcję
calculate_temperature()
zgodnie z wyżej przedstawionym wzorem - korzystając z przygotowanego konwertera wyznacz temperaturę dla każdego z pikseli
- wyzeruj wartości odczytanego obrazu poniżej ustalonego progu
- przygotuj suwak (createTrackbar()) pozwalający na dynamiczną zmianę progu temperatury
- zastąp tło własnym zdjęciem lub np. hawaii.jpg (Uwaga: zdjęcie musi mieć takie same wymiary co odczytywany z kamery obraz)
Przykładowy rezultat został przedstawiony poniżej:
Zadanie dodatkowe
Przygotuj zbiór danych do klasyfikacji gestów (papier
, kamień
, nożyce
, pozostałe/nierozpoznane
) dodając własne przykłady uczące dla każdej z klas przy wykorzystaniu skryptu gesture_capture.py
.
Przygotowany zbiór danych skompresuj z poziomu katalogu scripts
do formatu ZIP przy pomocy polecenia zip -r dataset.zip dataset/
. Następnie korzystając z przygotowanego notatnika Google Colab wytrenuj model klasyfikacji gestów oparty o architekturę SqueezeNet. W tym celu skopiuj notatnik do swojego dysku, prześlij skompresowany zbiór danych i postępuj dalej według instrukcji zawartych w notatniku. Po wytrenowaniu, pobraniu i rozpakowaniu (komenda: unzip model.zip
) używając skryptu gesture_recognition.py
wczytaj model rozpoznawania gestów i przetestuj jego działanie. Przykładowe wyniki zostały przedstawione poniżej: